package model.matrizes;

import java.util.Arrays;

public class MatrizBidimensional {
	
	private MatrizBidimensional() {} // classe estática
	
	public static void transposta(Object[][] matriz) {
		Object[][] copia = copiar(matriz);
		for (int i = 0; i<copia.length; i++) {
			for (int j = 0; j<copia[0].length; j++) {
				matriz[j][i] = copia[i][j];
			}
		}
	}

	/**
	 * Não copia os objetos internos, só a matriz.
	 * 
	 * @param matriz
	 * @return
	 */
	public static Object[][] copiar(Object[][] matriz) {
		Object[][] copia = new Object[matriz.length][matriz[0].length];
		for (int i = 0; i<matriz.length; i++) {
			copia[i] = Arrays.copyOf(matriz[i], matriz.length);
		}
		return copia;
	}


	/**
	 * Ultima coluna será a primeira, a penultima, a segunda e assim por diante.
	 * 
	 * @param matriz
	 */
	public static void espelharColunas(Object[][] matriz) {
		transposta(matriz); // O(nm) -> n é número de linhas e m o de colunas.
		espelharLinhas(matriz); // O(m)
		transposta(matriz); // O(nm)
		// O(m(2n+1)) Poderia ser menos custoso, mas não é necessário otimizar agora.
	}
	
	/**
	 * Ultima linha será a primeira, a penultima, a segunda e assim por diante.
	 * 
	 * @param matriz
	 */
	public static void espelharLinhas(Object[][] matriz) {
		Object[][] copia = copiar(matriz);
		int linha_copia = 0;
		for (int i = matriz.length-1; i>=0; i--) {
			linha_copia = matriz.length-1 - i;
			for (int j = 0; j<matriz[0].length; j++) {
				matriz[i][j] = copia[linha_copia][j];
			}
		}
	}
	
}
